perm filename XREFS.SAI[PUB,REG] blob
sn#195750 filedate 1976-01-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGOF("XREFS")
C00003 00003 PUBLIC SIMPLE PROCEDURE XREFS! $"#
C00004 00004 PUBLIC SIMPLE PROCEDURE FINIXREFS $"#
C00006 00005 PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF $"#
C00009 00006 PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) $"#
C00012 00007 FINISHED
C00013 ENDMK
C⊗;
BEGOF("XREFS")
COMMENT
*** Variations at Different Sites ***
TENEX PUB has a different naming scheme for intermediate files.
***
Labels and cross-references. Page labels are the trickiest because
they are always forward references, but they are resolved as soon as
the page is written out.
;
PROCEDURES
PUBLIC SIMPLE PROCEDURE XREFS! ;$"#
BEGIN "XREFS!"
PLBL ← BRKPLBL ← -TWO(13) ;
END "XREFS!" ;
PUBLIC SIMPLE PROCEDURE FINIXREFS ;$"#
BEGIN "FINIXREFS"
COMMENT Write out Labels for Pass Two ;
L ← WRITEON(FALSE, IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC) ;
OUT(L, CVSR(XSYMNO MAX IHIGH) ) ;
FOR J ← 1 THRU XSYMNO DO
IF (BYTEWD ← NUMBER[J]) NEQ 0 AND (K← LDB(SYMBOLWD(BYTEWD))) = 0 OR K='17777 THEN
IF LDB(PLIGHTWD(BYTEWD)) = 2 THEN OUT(L, CVSR(0) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))]&ALTMODE )
ELSE WARN("=","Undefined Label "&SYM[J]) ;
FOR J ← 1 THRU IHIGH DO IF LH(BYTEWD ← ITBL[J]) = '400000 THEN
OUT(L, CVSR(1) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))] & ALTMODE) ;
RELEASE(L) ;
END "FINIXREFS" ;
PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF ;$"#
IF NOT NEXTSCH(:) THEN RETURN(FALSE)
ELSE IF NOT ON THEN
BEGIN
WHILE THISISID AND NEXTSCH(:) DO BEGIN PASS ; PASS END ;
IF NOT NEXTSTATEMENT THEN E(0, 0) ; RETURN(TRUE) ;
END
ELSE
BEGIN
INTEGER LINK, PTR, PLIGHT, USYMB, WASSYMB, VALPTR ; STRING DEFVAL ;
SIMPLE PROCEDURE CHECK!CONSISTENCY ;
IF WASSYMB AND USYMB NEQ 0 AND LDB(IXN(WASSYMB)) NEQ LDB(IXN(ABS(USYMB))) THEN
WARN("=",<"Label "&SYM[LINK]&" was cross-referenced as a "&
SYM[WASSYMB]&" but is being defined as a "&
SYM[ABS(USYMB)]>) ;
LINK ← 0 ;
DO BEGIN "MULTIPLE LABELS"
PTR ← SYMNUM(THISWD&":") ; BYTEWD ← NUMBER[PTR] ;
IF BYTEWD=0 OR ( PLIGHT ← LDB(PLIGHTWD(BYTEWD)) ) = 1 THEN
BEGIN NUMBER[PTR] ← BYTEWD LSH 13 LOR LINK ; LINK ← PTR END
ELSE WARN("=",<"Label "&SYM[PTR]&" is already defined as "&
(IF PLIGHT=2 THEN STBL[IX] ELSE "a recent page number")>) ;
PASS ; PASS ;
END "MULTIPLE LABELS"
UNTIL NOT (THISISID AND NEXTSCH(:)) ;
IF LINK = 0 THEN RETURN(TRUE) ; TES 11/29/73 ;
DEFVAL ← IF (USYMB←NEXTSTATEMENT)=0 THEN E(0,0)
ELSE IF USYMB>TWO(13) THEN "??"
ELSE IF USYMB>0 THEN C! ELSE !;
IF EQU(DEFVAL,0) OR USYMB = SYMPAGE THEN
DO BEGIN "PAGE LABELS"
NUMBER[LINK] SWAP PLBL ; WASSYMB ← PLBL LSH -13 ;
CHECK!CONSISTENCY ;
PLBL SWAP LINK ; LINK ← LINK LAND '17777 ; PLBL ← -PLBL ;
END "PAGE LABELS"
UNTIL LINK=0
ELSE BEGIN "OTHER COUNTER"
IF XCRIBL THEN COMPMAXIMS ; TES 11/2/74 SO XLENGTH WON'T COMPLAIN ;
VALPTR ← 2 ROT -2 LOR PUTS(DEFVAL&(IF XCRIBL THEN ALTMODE&CVS(XLENGTH(DEFVAL)) ELSE NULL)) ;
DO BEGIN
PTR ← VALPTR ; NUMBER[LINK] SWAP PTR ; WASSYMB ← PTR LSH -13 ;
CHECK!CONSISTENCY ;
LINK ← PTR LAND '17777 ;
END
UNTIL LINK=0 ;
END "OTHER COUNTER" ;
RETURN(TRUE) ;
END "LABELDEF" ;
PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) ;$"#
IF NOT ON THEN RETURN(NULL) ELSE
BEGIN "LABELREF"
INTEGER PTR, PLIGHT, WASSYMB ; STRING S ;
IF NULSTR(THISWD) THEN COMMENT, Generated Label for {PAGE}. USYMB=0.;
PTR ← (PLBL ← PUTI(1, PLBL)) LOR TWO(14) COMMENT Add to Linked List ;
ELSE IF BYTEWD ← NUMBER[ PTR ← SYMNUM(THISWD & ":") ] THEN
BEGIN "KNOWN LABEL"
CASE (PLIGHT ← LDB(PLIGHTWD(BYTEWD))) MOD 3 OF
BEGIN COMMENT BY PLIGHT ;
COMMENT 0 or 3 ... Page Label still Uncertain ; WASSYMB ← SYMPAGE ;
COMMENT 1 ... Referenced but not defined ; WASSYMB ← LDB(IXWD(BYTEWD)) ;
COMMENT 2 ... Defined and Certain ;
BEGIN
BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
BREAKSET(LOCAL!TABLE,NULL,"O");
S ← STBL[LDB(IXWD(BYTEWD))] ;
RETURN (SCAN(S,LOCAL!TABLE,DUMMY));
END;
END ; COMMENT BY PLIGHT ;
IF USYMB AND LDB(IXN(USYMB)) NEQ LDB(IXN(WASSYMB)) THEN
BEGIN "DIFFERENT COUNTER"
IF WASSYMB THEN WARN("X-REF ERROR",<"Label "&SYM[PTR]&
" was cross-referenced as a "&SYM[WASSYMB]&
" earlier, but now as a "&SYM[USYMB]>) ;
IF PLIGHT = 1 THEN NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
END "DIFFERENT COUNTER" ;
END "KNOWN LABEL"
ELSE NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
RETURN(RUBOUT & CVS(LEN) & VT & CVS(PTR) & VT) ;
END "LABELREF" ;
FINISHED
ENDOF("XREFS")